import {Color} from '../../math/Color.js';
import {Vector2} from '../../math/Vector2.js';
import {Matrix3} from '../../math/Matrix3.js';

/**
 * Uniforms library for shared webgl shaders
 */

const UniformsLib = {

  common: {

    diffuse: {value: new Color(0xeeeeee)},
    opacity: {value: 1.0},

    map: {value: null},
    uvTransform: {value: new Matrix3()},
    uv2Transform: {value: new Matrix3()},

    alphaMap: {value: null},

  },

  specularmap: {

    specularMap: {value: null},

  },

  envmap: {

    envMap: {value: null},
    flipEnvMap: {value: -1},
    reflectivity: {value: 1.0},
    refractionRatio: {value: 0.98},
    maxMipLevel: {value: 0}

  },

  aomap: {

    aoMap: {value: null},
    aoMapIntensity: {value: 1}

  },

  lightmap: {

    lightMap: {value: null},
    lightMapIntensity: {value: 1}

  },

  emissivemap: {

    emissiveMap: {value: null}

  },

  bumpmap: {

    bumpMap: {value: null},
    bumpScale: {value: 1}

  },

  normalmap: {

    normalMap: {value: null},
    normalScale: {value: new Vector2(1, 1)}

  },

  displacementmap: {

    displacementMap: {value: null},
    displacementScale: {value: 1},
    displacementBias: {value: 0}

  },

  roughnessmap: {

    roughnessMap: {value: null}

  },

  metalnessmap: {

    metalnessMap: {value: null}

  },

  gradientmap: {

    gradientMap: {value: null}

  },

  fog: {

    fogDensity: {value: 0.00025},
    fogNear: {value: 1},
    fogFar: {value: 2000},
    fogColor: {value: new Color(0xffffff)}

  },

  lights: {

    ambientLightColor: {value: []},

    lightProbe: {value: []},

    directionalLights: {
      value: [], properties: {
        direction: {},
        color: {}
      }
    },

    directionalLightShadows: {
      value: [], properties: {
        shadowBias: {},
        shadowNormalBias: {},
        shadowRadius: {},
        shadowMapSize: {}
      }
    },

    directionalShadowMap: {value: []},
    directionalShadowMatrix: {value: []},

    spotLights: {
      value: [], properties: {
        color: {},
        position: {},
        direction: {},
        distance: {},
        coneCos: {},
        penumbraCos: {},
        decay: {}
      }
    },

    spotLightShadows: {
      value: [], properties: {
        shadowBias: {},
        shadowNormalBias: {},
        shadowRadius: {},
        shadowMapSize: {}
      }
    },

    spotShadowMap: {value: []},
    spotShadowMatrix: {value: []},

    pointLights: {
      value: [], properties: {
        color: {},
        position: {},
        decay: {},
        distance: {}
      }
    },

    pointLightShadows: {
      value: [], properties: {
        shadowBias: {},
        shadowNormalBias: {},
        shadowRadius: {},
        shadowMapSize: {},
        shadowCameraNear: {},
        shadowCameraFar: {}
      }
    },

    pointShadowMap: {value: []},
    pointShadowMatrix: {value: []},

    hemisphereLights: {
      value: [], properties: {
        direction: {},
        skyColor: {},
        groundColor: {}
      }
    },

    // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
    rectAreaLights: {
      value: [], properties: {
        color: {},
        position: {},
        width: {},
        height: {}
      }
    },

    ltc_1: {value: null},
    ltc_2: {value: null}

  },

  points: {

    diffuse: {value: new Color(0xeeeeee)},
    opacity: {value: 1.0},
    size: {value: 1.0},
    scale: {value: 1.0},
    map: {value: null},
    alphaMap: {value: null},
    uvTransform: {value: new Matrix3()}

  },

  sprite: {

    diffuse: {value: new Color(0xeeeeee)},
    opacity: {value: 1.0},
    center: {value: new Vector2(0.5, 0.5)},
    rotation: {value: 0.0},
    map: {value: null},
    alphaMap: {value: null},
    uvTransform: {value: new Matrix3()}

  }

};

export {UniformsLib};
